Load code

Load data

single lemma

metrics for all lemmas

Filter data

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Case studies

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date) %>%
  View()

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Single lemma

uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)

Degree centralization

Diachronic

plt <- df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% cases
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=FALSE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

plt


# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Comparative analyses

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full',
    USES >= 2
    ) %>%
  arrange(
    # (CENT_DEGREE)
    desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt

# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    # USES >= 1000,
    USES_TOT >= 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
  ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
    geom_line() +
    geom_point()

Biggest changes

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Usage intensity vs. network characteristics

Uses vs. degree centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'full'
    # USES %in% (10000:2000000),
    # USES %in% (150000:500000),
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization',
      # trans='log'
      ) +
    ggtitle(
      # 'Usage frequency vs. degree centralization: full sample'
      'Usage frequency vs. degree centralization: zooming on case study lexemes'
      )
    # geom_smooth(method=lm)

ggplotly(plt)

# ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)
    

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'full'
    ) %>%
  select(LEMMA, USES_TOT, SUBSET, USES, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.5216, df = 544, p-value = 0.01197
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.18968708 -0.02378785
sample estimates:
       cor 
-0.1074856 

Degree centrality vs. communities

Correlation

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(CENT_DEGREE, COMMUNITIES) %>%
  mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
  correlate()

Plot

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log')

Uses vs. users

Plot

plt <- df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, USES_TOT, USERS_TOT) %>%
  ggplot(., aes(x=USERS_TOT, y=USES_TOT)) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log') +
    scale_y_continuous(trans='log') +
    geom_smooth(method=lm)
ggplotly(plt)

Correlation

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(USES_TOT, USERS_TOT) %>%
  correlate()

Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )

COEF_VAR vs. CENT

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
  ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
    geom_text(aes(label=LEMMA))

    # scale_y_continuous(trans='log')

Correlations: EDA

library(Hmisc)

df_corr <- df_comp %>%
  # filter(SUBSET == 'last') %>%
  select(-c(LEMMA, SUBSETTING, SUBSET, START, END, SKIP, STAMP)) %>%
  select(-c(USERS_TOT, AGE)) %>%
  mutate(FOCUS = USES_TOT) %>%
  focus(FOCUS) %>%
  ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
  geom_col() +
  coord_flip()
Fehler in UseMethod("focus_") : 
  nicht anwendbare Methode für 'focus_' auf Objekt der Klasse "c('tbl_df', 'tbl', 'data.frame')" angewendet
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCgojIExvYWQgZGF0YQoKIyMgc2luZ2xlIGxlbW1hCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdBbmdsby1TYXhvbicKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKYGBgCgojIyBtZXRyaWNzIGZvciBhbGwgbGVtbWFzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQppZiAoZXhpc3RzKCdkZl9jb21wJykgPT0gRkFMU0UpIHsKICBkZl9jb21wIDwtIHJlYWRfZGZfY29tcCgpCn0KYGBgCgoKIyBGaWx0ZXIgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPD4lIAogIGZpbHRlcigKICAgIFNLSVAgIT0gVFJVRSwKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnCiAgICAjIHN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UID49IDEwMDAwCiAgICAjIHVuc3VjY2Vzc2Z1bCB3b3JkczogVVNFU19UT1QgPD0gMTAwMDAKICAgICMgd2VpcmQgd29yZHM6IGJpZyBkaWNrIGVuZXJneQogICAgIyBlc3RhYmxpc2hlZCB3b3JkcyBmcm9tIGxpc3QKICAgICkKYGBgCgoKIyMgVXNlcyBpbiBmaXJzdCBzdWJzZXQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdvbmUnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVMpICU+JQogIGFycmFuZ2UoVVNFUykKYGBgCgoKCiMgQ2FzZSBzdHVkaWVzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjYXNlcyA8LSBjKAogICdnaG9zdGluZycsIAogICdsaXR1YXRpb24nLCAKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICd1cGN5Y2xpbmcnLAogICd1cHNraWxsJywKICAnYmFlY2F0aW9uJywKICAnZGFzaGNhbScsCiAgJ292ZXJ0b3VyaXNtJwogICkKYGBgCgoKIyMgQ2hlY2sgdHdlZXRzCgpgYGB7cn0KdHdlZXRzICU+JQogIHNlbGVjdCh0d2VldCwgZGF0ZSkgJT4lCiAgIyBzbGljZSguLCBzYW1wbGUoMTpuKCkpKSAjcmFuZG9tIHNlbGVjdGlvbgogIGFycmFuZ2UoZGF0ZSkgJT4lCiAgVmlldygpCmBgYAoKCiMjIFVzYWdlIGZyZXF1ZW5jeQoKIyMjIE92ZXJhbGwgYWNyb3NzIGNhc2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICAgYXJyYW5nZShkZXNjKFVTRVNfVE9UKSkKYGBgCgoKCiMjIyBTaW5nbGUgbGVtbWEKCmBgYHtyfQp1c2VzIDwtIGdldF91c2VzKHR3ZWV0cykKdXNlc190b3QgPC0gZ2V0X3VzZXNfdG90KHVzZXMpCmFnZSA9IGdldF9hZ2UodXNlcykKY29lZl92YXIgPC0gZ2V0X2NvZWZfdmFyKHVzZXMpCm1lYW5fZGF0ZSA8LSBnZXRfbWVhbl9kYXRlKHVzZXMpCm1heF9kYXRlIDwtIGdldF9tYXhfZGF0ZSh1c2VzKQp1c2VzX21vbnRoIDwtIGNvbnZfdXNlc19tb250aCh1c2VzKQp1c2VzX3BsdCA8LSBwbHRfdXNlcyh1c2VzX21vbnRoLCBsZW1tYSwgbWVhbl9kYXRlLCBtYXhfZGF0ZSkKZ2dwbG90bHkodXNlc19wbHQpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBMRU1NQSAlaW4lIGNhc2VzCiAgKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PUNFTlRfREVHUkVFKSkgKyAjIGdyb3VwPTEKICAgIGdlb21fcG9pbnQoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgc2hhcGU9TEVNTUEpKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgbGluZXR5cGU9TEVNTUEpKSArCiAgICBndWlkZXMoZ3JvdXA9RkFMU0UpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9kZWdfZGlhY19Bbmdsby1TYXhvbi5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXJhbGwKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdCgKICAgIExFTU1BLCAKICAgIEVER0VTLAogICAgQ0VOVF9ERUdSRUUsIAogICAgQ0VOVF9FVgogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpCmBgYAoKCiMgQ29tcGFyYXRpdmUgYW5hbHlzZXMKCgojIyBEZWdyZWUgY2VudHJhbGl0eQoKCiMjIyBPdmVyYWxsCgojIyMjIExpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSwgQ0VOVF9FVikgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVMgPj0gMgogICAgKSAlPiUKICBhcnJhbmdlKAogICAgIyAoQ0VOVF9ERUdSRUUpCiAgICBkZXNjKENFTlRfRVYpCiAgKQpgYGAKCgojIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1yZW9yZGVyKExFTU1BLCBDRU5UX0RFR1JFRSkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9kaXNjcmV0ZSgnbGVtbWFzJykgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfc3luY19hbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyIHRpbWUKCiMjIyMgQWNyb3NzIGFsbCBsZW1tYXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgVVNFU19UT1QgPj0gMTAwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoQ0VOVF9BVkcgPSBtZWFuKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0FWRywgZ3JvdXA9MSkpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoKQpgYGAKCgojIyMjIEJpZ2dlc3QgY2hhbmdlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIENFTlRfREVHUkVFLCBFREdFUywgVVNFU19UT1QpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoCiAgICAgICdvbmUnLCAKICAgICAgJ2ZvdXInCiAgICAgICksCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoQ0VOVF9ESUZGID0gQ0VOVF9ERUdSRUUgLSBsYWcoQ0VOVF9ERUdSRUUsIGRlZmF1bHQ9Q0VOVF9ERUdSRUVbMV0pKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIENFTlRfTEFTVCA9IENFTlRfREVHUkVFLAogICAgRURHRVNfTEFTVCA9IEVER0VTCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfRElGRikpCmBgYAoKCiMgVXNhZ2UgaW50ZW5zaXR5CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQpgYGAKCgoKIyBVc2FnZSBpbnRlbnNpdHkgdnMuIG5ldHdvcmsgY2hhcmFjdGVyaXN0aWNzCgojIyBVc2VzIHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb24KCiMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJwogICAgIyBVU0VTICVpbiUgKDEwMDAwOjIwMDAwMDApLAogICAgIyBVU0VTICVpbiUgKDE1MDAwMDo1MDAwMDApLAogICAgIyAhTEVNTUEgJWluJSBjKCdzbHV0IHNoYW1pbmcnLCAnZGFzaGNhbScsICdzaGFyZWFibGUnLCAnY3Vja29sZCcsICdkZWVwIGxlYXJuaW5nJywgJ2h5cGVybG9jYWwnKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBVU0VTLCBFREdFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICd1c2FnZSBmcmVxdWVuY3kgKGxvZyknLCAKICAgICAgdHJhbnM9J2xvZycKICAgICAgKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24nLAogICAgICAjIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgZ2d0aXRsZSgKICAgICAgIyAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IGZ1bGwgc2FtcGxlJwogICAgICAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IHpvb21pbmcgb24gY2FzZSBzdHVkeSBsZXhlbWVzJwogICAgICApCiAgICAjIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKCmdncGxvdGx5KHBsdCkKIyBnZ3NhdmUoJ34vRGVza3RvcC9mcmVxLXZzLW5ldC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKICAgIApgYGAKCgojIyMgQmlnZ2VzdCBkaXNjcmVwYW5jaWVzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVRUSU5HID09ICd0aW1lJywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgbXV0YXRlKERJU0MgPSBVU0VTX1RPVCAvIENFTlRfREVHUkVFKSAlPiUKICBhcnJhbmdlKERJU0MpCmBgYAoKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvcnIgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICAjIFNVQlNFVCAhPSAnZnVsbCcKICAgICMgRURHRVMgPj0gMTAwCiAgICApICU+JQogIHNlbGVjdCgtYyhMRU1NQSwgU1VCU0VULCBTVEFSVCwgRU5ELCBTS0lQLCBTVEFNUCkpCiAgCmNvci50ZXN0KGRmX2NvcnIkVVNFUywgZGZfY29yciRDRU5UX0RFR1JFRSkKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkgdnMuIGNvbW11bml0aWVzCgojIyMgQ29ycmVsYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoQ0VOVF9ERUdSRUUsIENPTU1VTklUSUVTKSAlPiUKICBtdXRhdGUoQ09NTVVOSVRJRVMgPSBhcy5udW1lcmljKENPTU1VTklUSUVTKSkgJT4lCiAgY29ycmVsYXRlKCkKYGBgCgoKIyMjIFBsb3QKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBDT01NVU5JVElFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PWFzLm51bWVyaWMoQ09NTVVOSVRJRVMpKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAgIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nJykKYGBgCgoKCiMjIFVzZXMgdnMuIHVzZXJzCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBVU0VSU19UT1QpICU+JQogIGdncGxvdCguLCBhZXMoeD1VU0VSU19UT1QsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cnKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKZ2dwbG90bHkocGx0KQpgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChVU0VTX1RPVCwgVVNFUlNfVE9UKSAlPiUKICBjb3JyZWxhdGUoKQpgYGAKCgojIyBDb2VmZmljaWVudCBvZiB2YXJpYXRpb24KCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcsCiAgICBVU0VTX1RPVCA+PSAxMDAwCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENPRUZfVkFSKSAlPiUKICBhcnJhbmdlKGRlc2MoQ09FRl9WQVIpKQpgYGAKCgojIyBQcm9jZXNzaW5nIHN0YXR1cwoKIyMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyMgRGF0YXNldCBzdGF0aXN0aWNzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVNfVE9ULCBVU0VSU19UT1QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBVU0VTX0FMTCA9IHN1bShVU0VTX1RPVCksCiAgICBVU0VSU19BTEwgPSBzdW0oVVNFUlNfVE9UKQogICAgKQpgYGAKCgojIENPRUZfVkFSIHZzLiBDRU5UCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBDT0VGX1ZBUiwgQ0VOVF9ERUdSRUUpICU+JQogIGdncGxvdCguLCBhZXMoeT1DT0VGX1ZBUiwgeD1DRU5UX0RFR1JFRSkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpCmBgYAoKCiMgQ29ycmVsYXRpb25zOiBFREEKCmBgYHtyfQpsaWJyYXJ5KEhtaXNjKQoKZGZfY29yciA8LSBkZl9jb21wICU+JQogICMgZmlsdGVyKFNVQlNFVCA9PSAnbGFzdCcpICU+JQogICMgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVRUSU5HLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkgJT4lCiAgIyBzZWxlY3QoLWMoVVNFUlNfVE9ULCBBR0UpKSAlPiUKICAjIG11dGF0ZShGT0NVUyA9IFVTRVNfVE9UKSAlPiUKICAjIGZvY3VzKEZPQ1VTKSAlPiUKICAjIGdncGxvdCguLCBhZXMocmVvcmRlcihyb3duYW1lLCBGT0NVUyksIEZPQ1VTKSkgKwogICMgZ2VvbV9jb2woKSArCiAgIyBjb29yZF9mbGlwKCkKICAjIHJlYXJyYW5nZSgpICU+JQogICMgc2hhdmUoKSAlPiUKICAjIHJwbG90KCkKICAjIG5ldHdvcmtfcGxvdChtaW5fY29yPS41KSAlPiUKCiAgCmBgYAoKCiAg